package at.donalfonso.model;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import org.mozartspaces.capi3.Index;
import org.mozartspaces.capi3.Queryable;

import at.donalfonso.model.Pizza.PizzaEnum;

@Queryable
public class Bestellung implements Serializable{

	/**
	 * 
	 */
	private static final long serialVersionUID = 5537330342577464143L;

	private String id;
	
	/* Die Gruppe welche diese Bestellung aufgegeben hat. */
	@Index
	private String gruppenId;

	@Index
	private BestellungStatus status;
	private String zuweisKellner = "";
	protected String bestellKellner = "";
	private String servierKellner = "";
	private String bezahlKellner = "";
	
	private static int uniqueId = 4000;
	protected int offeneBestellungen = 0;
	public List<Pizza> pizzen = new ArrayList<Pizza>();
	
	private int filiale;
	
	// Nur für Templates des LindaCoordinator
	public Bestellung() {

	}
	
	public Bestellung(int filiale) {
		
		this.filiale = filiale;
		
		id = "B"+"."+filiale+"."+getNextId();
		status = BestellungStatus.BESTELLT;
//		pizzen = new ArrayList<Pizza>();
	}
	
	public Bestellung(int filiale, List<PizzaEnum> pizzawunsch) {
		id = "B"+"."+filiale+"."+getNextId();
		status = BestellungStatus.BESTELLT;
//		pizzen = new ArrayList<Pizza>();
		
		int pizzanr = 1;
		
		for (PizzaEnum pe: pizzawunsch) {
//			if (pe == null) continue; // für LieferBestellung nötig.
			
			Pizza p = new Pizza(pe, getBestellungId() + "P" + pizzanr);
			pizzen.add(p);
			offeneBestellungen++;
			pizzanr++;
		}
	}
	
	public Bestellung(Bestellung bestellung) {
		id = bestellung.getBestellungId();
		gruppenId = bestellung.getGruppenId();
		status = bestellung.getStatus();
		pizzen = bestellung.getPizzen();
		filiale = bestellung.getFiliale();
	}
	
	public void addPizzen(List<PizzaEnum> pizzawunsch) {
		int pizzanr = 1;
		for (PizzaEnum pe: pizzawunsch) {
			Pizza p = new Pizza(pe, getBestellungId() + "P" + pizzanr);
			pizzen.add(p);
			offeneBestellungen++;
			pizzanr++;
		}
	}

	public void setGruppenId(String gruppenId){
		this.gruppenId = gruppenId;
	}
	
	public String getGruppenId() {
		if (gruppenId == null)
			return "";
		else
			return gruppenId;
	}
	
	public String getBestellungId(){
		return id;
	}
	
	public void setBestellungId(String id){
		this.id = id;
	}
	
	public BestellungStatus getStatus(){
		return status;
	}
	
	public void setStatus(BestellungStatus status){
		this.status = status;
	}
	
	public static int getNextId(){
		return ++uniqueId;
	}
	
	/**
	 * Nachdem der Koch eine Pizza fertiggestellt hat, liest er die zugehörige Bestellung aus 
	 * und ruft die Funktion pizzaFertig() auf.
	 */
	public void pizzaFertig(Pizza p){
		replacePizza(p);
		offeneBestellungen--;
	}
	
	public int getBestellungen(){
		return offeneBestellungen;
	}

	@Override
	public String toString() {
		StringBuffer s = new StringBuffer();
		s.append("Bestellung: "+getBestellungId()+" (" + status);
		if (status == BestellungStatus.BESTELLT) {
			s.append(", offen: " + offeneBestellungen);
		}
		s.append(") Tischzuweisung: " + zuweisKellner + " Bestellung: " + bestellKellner +
				" Servieren: " + servierKellner + " Bezahlung: " + bezahlKellner + 
				" -- Pizzen: [");
		for (Pizza p: pizzen) {
			s.append(p + " ");
		}
		s.append("]");
		return s.toString();
	}
	
	public void setTischZuweisung(String kellnername) {
		zuweisKellner = kellnername;
	}
	
	public void setBestellKellner(String name) {
		bestellKellner = name;
	}
	
	public void setServierKellner(String name) {
		servierKellner = name;
	}
	
	public void setBezahlKellner(String name) {
		bezahlKellner = name;
	}
	
	/**
	 * Überschrieben wegen Listanzeige
	 * gleiche Id bedeutet gleiche Bestellung
	 */
	public boolean equals(Object o) {
		if (this == o)
			return true;
		if ((o == null) || (o.getClass() != this.getClass()))
			return false;
		Bestellung b = (Bestellung) o;
		return (getBestellungId().equals(b.getBestellungId()));
	}

	public void replacePizza(Pizza p) {
		int index = pizzen.indexOf(p);
		if (index < 0) {
			System.err.println("Pizza nicht in Bestellung: " + p);
		}
		else {
			pizzen.set(index, p);
		}
	}

	public List<Pizza> getPizzen() {
		return pizzen;
	}
	
	public Boolean fertig() {
		return offeneBestellungen == 0;
	}
	
	public int getFiliale() {
		return filiale;
	}
	
}
